package dao;

import conexao.HibernateUtil;
import java.util.List;
import model.Receita;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Chris
 */
public class ReceitaDaoImpl implements ReceitaDao {

    private Session sessao;
    private Transaction transacao;

    public String incluir(Receita receita) {
        try {
            this.sessao = HibernateUtil.getSessionFactory().openSession();
            this.transacao = this.sessao.beginTransaction();
            this.sessao.save(receita);
            this.transacao.commit();
            return "Sucesso na inclusão da Receita.";
        } catch (HibernateException e) {
            return ("Não foi possível inserir a Receita. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                return ("Erro ao fechar operação de inserção. Mensagem: " + e.getMessage());
            }
        }
    }

    public String excluir(int codigo) {
        try {
            this.sessao = HibernateUtil.getSessionFactory().openSession();
            this.transacao = this.sessao.beginTransaction();
            this.sessao.delete(codigo);
            this.transacao.commit();
            return "Sucesso na exclusão da Receita.";
        } catch (HibernateException e) {
            return ("Não foi possível excluir a Receita. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                return ("Erro ao fechar operação de exclusão. Mensagem: " + e.getMessage());
            }
        }
    }

    public String alterar(Receita receita) {
        try {
            this.sessao = HibernateUtil.getSessionFactory().openSession();
            this.transacao = this.sessao.beginTransaction();
            this.sessao.update(receita);
            this.transacao.commit();
            return "Sucesso na alterção da Receita.";
        } catch (HibernateException e) {
            return ("Não foi possível alterar a Receita. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                return ("Erro ao fechar operação de atualização. Mensagem: " + e.getMessage());
            }
        }
    }

    public List<Receita> getReceitas() {

        List<Receita> receitas = null;

        try {
            this.sessao = HibernateUtil.getSessionFactory().openSession();
            this.transacao = this.sessao.beginTransaction();
            Criteria filtro = this.sessao.createCriteria(Receita.class);
            receitas = filtro.list();
            this.transacao.commit();
        } catch (Throwable e) {
            if (this.transacao.isActive()) {
                this.transacao.rollback();
            }
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de listagem. Mensagem: " + e.getMessage());
            }
        }
        return receitas;
    }

    public Receita getReceita(int codigo) {

        Receita receita = null;

        try {
            this.sessao = HibernateUtil.getSessionFactory().openSession();
            this.transacao = this.sessao.beginTransaction();
            Criteria filtro = this.sessao.createCriteria(Receita.class);
            filtro.add(Restrictions.eq("id_receita", codigo));
            receita = (Receita) filtro.uniqueResult();
            this.transacao.commit();
        } catch (Throwable e) {
            if (this.transacao.isActive()) {
                this.transacao.rollback();
            }
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de busca. Mensagem: " + e.getMessage());
            }
        }
        return receita;
    }

    public List<Receita> getReceitaTitulo(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.tituloReceita like :tituloReceita");
            consulta.setString("tituloReceita", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar autores. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaAutor(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.autor.nome like :nomeAutor ");
            consulta.setString("nomeAutor", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaCategoria(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.categoria.descricao like :nomeCat ");
            consulta.setString("nomeCat", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaGrauDificuldade(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.grauDificuldade.descricao like :descDific");
            consulta.setString("descDific", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaIngrediente(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.ingrediente.descricao like :nomeIng ");
            consulta.setString("nomeIng", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaRendimento(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.rendimento.descricao like :nomeRend ");
            consulta.setString("nomeRend", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaTempoDescricao(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.tempo.descricao like :descricaoTempo ");
            consulta.setString("descricaoTempo", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }

    public List<Receita> getReceitaTempoQuantidade(String filtro) {

        Query consulta = null;
        List<Receita> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Receita receita where receita.tempo.quantidade like :qndadeTempo ");
            consulta.setString("qndadeTempo", "%" + filtro + "%");
            resultado = consulta.list();
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Não foi possível selecionar receitas. Erro: " + e);
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação listar. Mensagem: " + e.getMessage());
            }
        }
        return resultado;
    }
}
